package base.hash;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.TreeSet;

public class HashSetMain {

	/**
	 * @param args
	 * G_Y
	 * 2018年3月21日
	 * 说明:HashSet测试
	 */
	public static void main(String[] args) {
		
		HashSet<A> hashSet = new HashSet<>();
		//TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
		TreeSet<A> treeSet = new TreeSet<>();
		ArrayList<A> arraylist = new ArrayList<>();
		LinkedList<A> linkedlist = new LinkedList<>();
		A a;
		A a2 = new A();
		Integer in = 1;
		a2.setId(in);
		a2.setName(String.valueOf(in));
		for(int i=0;i<100;i++) {
			a = new A();
			a.setId(i);
			a.setName(String.valueOf(i));
			if(i==1) {
				//a跟a2是相等的两个对象
				System.out.println(a.equals(a2));
			}
			hashSet.add(a);
			arraylist.add(a);
			linkedlist.add(a);
			treeSet.add(a);
		}
		//只能移除同一个已经存在的对象,equals相同的对象
		boolean b = hashSet.remove(a2);
		//删除成功则返回true 如果不存在则返回false
		System.out.println(b);
		boolean b2 = hashSet.remove(null);
		//删除null则也返回false
		System.out.println(b2);
	}

}
/**
 * @author G_Y
 * 2018年3月21日
 * 说明:
 * 原因在于我们需要告诉TreeSet如何来进行比较元素，如果不指定，就会抛出这个异常
 * 如何指定比较的规则，需要在自定义类(A)中实现```Comparable```接口，并重写接口中的compareTo方法
 */
class A implements Comparable<A>{
	
	private String name;
	private Integer id;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	
	@Override
	public int hashCode() {
		return id.hashCode();
	}
	@Override
	public boolean equals(Object a) {
		if(!(a instanceof A)) {
			return false;
		}
		A a2 = (A)a;
		if (a2.getId().equals(this.getId())) return true;
		return false;
	}
	@Override
	public int compareTo(A o) {
		return 1;
	}
	
}